package com.wuniutech.notebook

import android.content.Context
import android.net.Uri
import android.os.Environment
import android.os.Handler
import android.os.Looper
import java.io.*

object FileUtil {
    val handler = Handler(Looper.getMainLooper())

    /**
     * 删除某个目录
     * @param path 要删除的目录路径
     * @return
     */
    fun deleteDirs(path: String): Boolean {
        val file = File(path)
        if (!file.exists()) {
            return true
        }
        if (file.isDirectory) {
            val childs = file.listFiles() ?: return false
            var result = true
            for (child in childs) {
                result = result && deleteDirs(child.absolutePath)
            }
            return try {
                val ret = file.delete()
                result && ret
            } catch (e: Exception) {
                e.printStackTrace()
                false
            }
        } else {
            return try {
                file.delete()
            } catch (e: Exception) {
                e.printStackTrace()
                false
            }
        }
    }

    /**
     * 保存设备配置数据
     */
    fun saveToLocal(content: String, callback: (Boolean) -> Unit) {
        val dir = File(Environment.getExternalStorageDirectory().toString() + "/交易数据/")
        try {
            dir.mkdirs() //create folders where write files
            val file = File(dir, "gold_note.json")
            val out = FileOutputStream(file)
            out.write(content.toByteArray())
            out.flush()
            out.fd.sync()
            out.close()
            callback.invoke(true)
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
            callback.invoke(false)
        }
    }

    /**
     * 从本地读取json
     */
    fun readTextFile(callback: (Boolean, String) -> Unit) {
        val dir = Environment.getExternalStorageDirectory().toString() + "/交易数据/gold_note.json"
        val sb = StringBuilder()
        try {
            val file = File(dir)
            val inputStream: InputStream?
            inputStream = FileInputStream(file)
            val inputStreamReader = InputStreamReader(inputStream, "UTF-8")
            var tempbyte: Int
            while (inputStreamReader.read().also { tempbyte = it } != -1) {
                sb.append(tempbyte.toChar())
            }
            inputStream.close()
            inputStreamReader.close()
            callback.invoke(true, sb.toString())
        } catch (e: java.lang.Exception) {
            e.printStackTrace()
            callback.invoke(false, "")
        }
    }

    /**
     * 将数据写入到 SAF 返回的 Uri
     * @param uri SAF 返回的文件 Uri
     */
    fun saveDataToUri(context: Context,
        jsonDataToExport: String?,
        uri: Uri,
        callback: (Boolean, String) -> Unit) { // 这个方法在 SAF 选择文件后，在主线程中被调用
        jsonDataToExport?.let { jsonData ->
            try {
                context.contentResolver.openOutputStream(uri)?.use { outputStream ->
                    outputStream.write(jsonData.toByteArray())
                    outputStream.flush() // outputStream.fd.sync() // 可选，确保数据写入磁盘
                }
                callback.invoke(true, "数据已保存到 $uri")
            } catch (e: IOException) {
                e.printStackTrace()
                callback.invoke(false, "${e.message}")
            } finally {
            }
        } ?: run { // 如果 jsonDataToExport 为 null，表示没有数据要导出
            ToastUtil.showShortToast("没有数据可导出")
            callback.invoke(false, "没有数据可导出")
        }
    }

    /**
     * 从 SAF Uri 读取数据
     */
    fun readDataFromUri(context: Context,
        uri: Uri,
        callback: (Boolean, String, String) -> Unit) { // 这个方法在 SAF 选择导入文件后，在主线程中被调用
        // 实际的文件读取操作建议在子线程中执行
        val runnable = Runnable {
            var fileContent: String? = null
            try {
                context.contentResolver.openInputStream(uri)
                    ?.use { inputStream -> // 读取 inputStream 到 String
                        fileContent = inputStream.bufferedReader().use { it.readText() }
                    } // 文件读取成功，切换回主线程回调 JavaScript
                handler.post {
                    callback.invoke(true, fileContent ?: "", "数据读取成功")
                }
            } catch (e: IOException) {
                e.printStackTrace() // 文件读取失败，切换回主线程回调 JavaScript
                handler.post {
                    callback.invoke(false, "", "数据读取失败: ${e.message}")
                }
            }
        }
        ThreadPoolInstance.getInstance()?.getSingleThreadExecutor()?.execute(runnable)
    }
}